#include <signal.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>	/* sleep */

/*
 * int setjmp(jmp_buf env);  这个函数 将上下文 ，就是cpu和内存的信息保存到env中。
 *
 * 然后调用 void longjmp(jmp_buf env, int val); 的时候 跳转到使用env中的信息 ，恢复上下文。
 *
 *	如果是第一回调用setjmp 它会返回 0，如果是在 从longjmp 跳转过来的 ，那就返回 longjmp的参数 val，
 *	根据setjmp的返回值，就可以决定执行可能发生错误的代码还是直接跳过这段代码。
 */

jmp_buf env;

//信号处理函数
void recvSignal(int sig)
{
	printf("received signal %d !!!\n",sig);
			longjmp(env,1);
}
int main(int argc,char** argv)
{
    //保存一下上下文
    int r = setjmp(env);
    if(  r == 0)
    {
        //初次执行 ，那么可以执行 可能会发生错误的代码
        //给信号注册一个处理函数
        signal(SIGSEGV, recvSignal);
        printf("excute this code!!\n");
           int* s = 0;
            (*s) = 1;
    }
    else
    {
        //是由longjmp 跳转回来的
            printf("jump this code !!\n");
    }

    while(1)
    {
        sleep(1);
        printf("sleep 1 \n");
    }

    return 0;
}

#if 0

执行产生 SIGSEGV 信号 ，然后在信号函数里边跳转到  int r = setjmp(env); 这一行 ，
之后直接略过了可能发生错误的这段代码 ,跳转生效，可是这种方式还有一个bug

#endif
